import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router from '@/router'


// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 直接使用后端地址
  timeout: 30000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // if (getToken()) {
    // config.headers['Authorization'] = getToken() // 让每个请求携带自定义token
    config.headers['Authorization'] = '5fa7c565-5654-4716-9a18-f6291f30d781'
    // }
    return config
  },
  error => {
    // console.log(error)
    return Promise.reject(error)
  }
)

// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let retryRequests = []

// 响应拦截器
service.interceptors.response.use(
  response => {

    const res = response.data;

    // 如果返回码不是 200，处理错误
    if (res.code !== 200) {
      // 401: Token过期或未登录
      if (res.code === 401) {
        handleTokenExpired();
        return Promise.reject(new Error('登录已过期，请重新登录'));
      }

      // 其他错误
      if (res.code !== 400) {
        ElMessage({
          message: res.msg || '请求失败',
          type: 'error',
          duration: 5 * 1000
        });
      }

      // 统一返回错误信息
      return Promise.reject(new Error(res.msg || '请求失败'));
    }

    // 如果返回码是 200，直接返回数据
    return res;
  },
  error => {
    // 处理请求失败的情况（如网络错误、超时等）
    ElMessage({
      message: error.message || '请求失败，请稍后再试',
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  },
  error => {
    // console.log('err' + error)

    // 处理HTTP错误状态码
    if (error.response) {
      switch (error.response.status) {
        case 401:
          handleTokenExpired()
          break
        case 403:
          ElMessage({
            message: '没有权限访问该资源',
            type: 'error',
            duration: 5 * 1000
          })
          break
        case 404:
          ElMessage({
            message: '请求的资源不存在',
            type: 'error',
            duration: 5 * 1000
          })
          break
        case 500:
          ElMessage({
            message: '服务器内部错误',
            type: 'error',
            duration: 5 * 1000
          })
          break
        default:
          ElMessage({
            message: error.message || '请求失败',
            type: 'error',
            duration: 5 * 1000
          })
      }
    } else {
      ElMessage({
        message: '网络连接异常，请检查您的网络',
        type: 'error',
        duration: 5 * 1000
      })
    }

    return Promise.reject(error)
  }
)

// 处理token过期
const handleTokenExpired = () => {
  if (isRefreshing) return

  isRefreshing = true

  // 清除token
  removeToken()

  // 重定向到登录页面
  router.push('/')

  // 显示登录弹窗
  // 这里需要一个全局事件总线来触发登录弹窗
  // 或者使用Vuex/Pinia来管理登录弹窗状态
  window.dispatchEvent(new CustomEvent('show-login-dialog'))
  isRefreshing = false
  // ElMessageBox.confirm(
  //   '您的登录状态已过期，请重新登录',
  //   '登录过期',
  //   {
  //     confirmButtonText: '重新登录',
  //     cancelButtonText: '取消',
  //     type: 'warning'
  //   }
  // ).then(() => {
  //   // 重定向到登录页面
  //   router.push('/')

  //   // 显示登录弹窗
  //   // 这里需要一个全局事件总线来触发登录弹窗
  //   // 或者使用Vuex/Pinia来管理登录弹窗状态
  //   window.dispatchEvent(new CustomEvent('show-login-dialog'))
  // }).catch(() => {
  //   // 用户取消了重新登录
  //   console.log('用户取消了重新登录')
  // }).finally(() => {
  //   isRefreshing = false
  // })
}

export default service